package com.infra.server.webmagic;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

/**
 * @author win
 * @date 2021/11/23 17:59
 * 获取山东省空气质量相关数据
 * url: http://fb.sdem.org.cn:8801/AirDeploy.Web/AirQuality/MapMain.aspx?type=kqzl
 * 站点数据和指标详情数据
 */
public class KqzlPageProcessor implements PageProcessor {
    // 总数，计算爬虫次数
    private static int total = 0;
    // 爬取次数，为-1是排除初始的站点数据爬取
    private static int count = -1;

    @Override
    public void process(Page page) {
        count++;
        String rawText = page.getRawText();
        if (StrUtil.isNotEmpty(rawText)) {
            //        由于是json格式的数据，这里也可以采用JsonPathSelector专门处理
            //        具体语法可以参照：https://blog.csdn.net/weixin_37794119/article/details/81484885
            //        List<String> selectList = new JsonPathSelector("$.items").selectList(page.getRawText());
            JSONObject object = JSONObject.parseObject(rawText);
            if (ObjectUtil.isNotEmpty(object)) {
                String pageUrl = page.getUrl().get();
                if (!pageUrl.contains("Method=GetStationMarkOnMap")) {
                    // 指标详情数据
                    object.put("subid",pageUrl.substring(pageUrl.lastIndexOf("=") + 1));
                    page.putField("zbData",object);
                    if (count == total) {
                        // 爬虫结束
                        page.putField("finish",true);
                    }
                } else {
                    String url;
                    JSONArray siteData = object.getJSONArray("items");
                    page.putField("siteData",siteData);
                    for (int i = 0; i < siteData.size(); i++) {
                        // 获取具体的指标详情数据,POST请求,Method=GetQualityItemsValues&StationID=2
                        url = "http://fb.sdem.org.cn:8801/AirDeploy.Web/Ajax/AirQuality/AirQuality.ashx?Method=GetQualityItemsValues&StationID=" + siteData.getJSONObject(i).getString("subid");
                        page.addTargetRequest(url);
//                        total = siteData.size();
                        if (i == 3) {
                            total = i + 1;
                            break;
                        }
                    }
                }
            } else {
                //设置skip之后，这个页面的结果不会被Pipeline处理
                page.setSkip(true);
            }
        }

    }

    /**
     * 对爬虫进行一些设置
     * setCharset(String)	设置编码	site.setCharset(“utf-8”)
     * setUserAgent(String)	设置UserAgent	site.setUserAgent(“Spider”)
     * setTimeOut(int)	设置超时时间，单位是毫秒	site.setTimeOut(3000)
     * setRetryTimes(int)	设置重试次数	site.setRetryTimes(3)
     * setCycleRetryTimes(int)	设置循环重试次数	site.setCycleRetryTimes(3)
     * addCookie(String,String)	添加一条cookie	site.addCookie(“dotcomt_user”,“code4craft”)
     * setDomain(String)	设置域名，需设置域名后，addCookie才可生效	site.setDomain(“github.com”)
     * addHeader(String,String)	添加一条addHeader	site.addHeader(“Referer”,“https://github.com”)
     */
    @Override
    public Site getSite() {
        return Site.me()
                .setCharset("UTF-8")
                .setTimeOut(1000 * 10);
//                .setRetryTimes(3)
//                .setRetrySleepTime(3000);
    }

    /**
     * WebMagic使用的默认下载器是HttpClient
     * 根据观察网站发现，为动态页面，并且页面上时间是通过js获取当前系统时间生成，站点列表通过ajax请求生成，故这里初始url直接请求站点列表数据
     * 获取到站点列表数据后，根据具体参数在拼接url请求具体各个站点的的指标详情数据
     */
    public static void main(String[] args) {
        Spider.create(new KqzlPageProcessor())
                .addUrl("http://fb.sdem.org.cn:8801/AirDeploy.Web/Ajax/AirQuality/AirQuality.ashx?Method=GetStationMarkOnMap")
                .addPipeline(new KqzlPipeline())
                .thread(5)
                .run();
    }
}
